home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 441 / dlibs12 / fgetc.c < prev    next >
C/C++ Source or Header  |  1990-11-23  |  2KB  |  80 lines

  1. #include <stdio.h>
  2.  
  3. int fgetc(fp)
  4.     register FILE *fp;
  5.     {
  6.     register int c, f, m, look = FALSE;
  7.  
  8.     f = (fp->_flag &= ~_IORW);
  9.     if(!(f & _IOREAD) || (f & (_IOERR | _IOEOF)))
  10.         return(EOF);
  11.     if(fp->_base == NULL)    /* allocate a buffer if there wasn't one */
  12.         _getbuf(fp);
  13. _fgetc1:
  14.     if(--(fp->_cnt) < 0)
  15.         {
  16.         if(f & _IODEV)
  17.             m = _tttty(fp);
  18.         else
  19.             m = read(fp->_file, fp->_base, fp->_bsiz);
  20.         if(m <= 0)
  21.             {
  22.             fp->_flag |= ((m == 0) ? _IOEOF : _IOERR);
  23.             c = EOF;
  24.             goto _fgetc2;
  25.             }
  26.         fp->_cnt = (m - 1);
  27.         fp->_ptr = fp->_base;
  28.         }
  29.     c = *(fp->_ptr)++;
  30. _fgetc2:
  31.     if(!(f & _IOBIN))        /* TRANSLATED STREAM PROCESSING */
  32.         {
  33.         if(look)            /* process lookahead */
  34.             {
  35.             if(c != '\n')        /* if not CR+LF.. */
  36.                 {
  37.                 if(c == EOF)    /* ..undo EOF.. */
  38.                     {
  39.                     fp->_flag &= ~(_IOERR | _IOEOF);
  40.                     }
  41.                 else        /* ..or unget character */
  42.                     {
  43.                     *--(fp->_ptr) = c;
  44.                     ++(fp->_cnt);
  45.                     }
  46.                 c = '\r';    /* return CR */
  47.                 }
  48.             }
  49.         else if(c == '\r')        /* found CR */
  50.             {
  51.             if(f & _IODEV)        /* return it for tty */
  52.                 c = '\n';
  53.             else            /* else lookahead for LF */
  54.                 {
  55.                 look = TRUE;
  56.                 goto _fgetc1;
  57.                 }
  58.             }
  59.         else if(c == 0x00)        /* Ignore NUL's */
  60.             goto _fgetc1;
  61.         else if(c == 0x1A)        /* ^Z becomes EOF */
  62.             {
  63.             fp->_flag |= _IOEOF;
  64.             c = EOF;
  65.             }
  66.         }
  67.     return(c);
  68.     }
  69.  
  70. int fungetc(c, fp)
  71.     char c;
  72.     register FILE *fp;
  73.     {
  74.     if((fp->_flag & (_IOERR | _IOEOF))    /* error or eof */
  75.     || (fp->_ptr <= fp->_base))        /* or too many ungets */
  76.         return(EOF);
  77.     ++(fp->_cnt);
  78.     return(*--(fp->_ptr) = c);
  79.     }
  80.